package org.meetunexpectedly.service.video;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.meetunexpectedly.entity.video.Video;
import org.meetunexpectedly.entity.vo.BasePage;
import org.meetunexpectedly.entity.vo.HotVideo;

import javax.servlet.http.HttpServletRequest;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;

/**
 * @Description: 视频服务接口
 * @Author: pupil
 * @Date: 2024/08/17 下午 6:18
 */
public interface VideoService extends IService<Video> {

    /**
     * 发布视频/修改视频
     * @param video
     * @return
     */
    void publishVideo(Video video);

    /**
     * 删除视频
     * @param id 视频id
     * @return
     */
    Boolean deleteVideo(Long id);

    /**
     * 查询用户所管理的视频
     * @param basePage 基础分页信息
     * @param userId 用户id
     * @return
     */
    IPage<Video> getUserVideos(BasePage basePage, Long userId);

    /**
     * 点赞视频
     * @param videoId 视频id
     * @return
     */
    Boolean thumbUpVideo(Long videoId);


    /**
     * 分享视频
     * @param videoId 视频id
     * @param request 网络请求
     * @return
     */
    Boolean shareVideo(Long videoId, HttpServletRequest request);

    /**
     * 根据id获取视频信息
     * @param videoId 视频id
     * @param userId 用户id
     * @return
     */
    Video getVideoById(Long videoId, Long userId);

    /**
     * 获取该用户所发布的视频
     * 视频是公开状态的
     * @param userId 用户id
     * @return
     */
   Collection<Long> listVideoIdByUserId(Long userId);

    /**
     * 根据userId获取对应视频
     * 视频是公开状态的
     * @param userId
     * @return
     */
    IPage<Video> getVideoByUserId(Long userId, BasePage basePage);

    /**
     * 关注流
     * @param userId 用户id
     * @param lastTime 滚动分页参数，首次为null，后续为上次的末尾视频时间
     * @return
     */
    Collection<Video> followFeed(Long userId, Long lastTime);

    /**
     * 初始化关注流 拉模式
     * 收件箱中无数据，获取7天内的视频
     * 收件箱中有数据，根据当前实际-第一条视频发布时间差值进行视频获取
     * @param userId
     */
    void initFollowFeed(Long userId);

    /**
     * 获取当前审核队列状态
     * @return
     */
    String getAuditQueueState();


    /**
     * 搜索视频
     * @param searchName 搜索参数,可能是标题,用户,YV
     * @param basePage 基础分页信息
     * @param userId 网络请求
     * @return
     */
    IPage<Video> searchVideo(String searchName, BasePage basePage, Long userId);

    /**
     * 主页推送视频
     * @param userId 用户id
     * @return
     */
    Collection<Video> pushVideos(Long userId);

    /**
     * 根据视频分类获取视频,乱序
     * @param typeId 分类id
     * @return
     */
    Collection<Video> getVideoByTypeId(Long typeId);

    /**
     * 根据收藏夹id获取用户收藏的视频
     * @param favoriteId 收藏夹id
     * @return
     */
    Collection<Video> getFavoritesVideos(Long favoriteId);

    /**
     * 收藏视频
     * @param favoriteId
     * @param videoId
     * @return
     */
    Boolean favoritesVideo(Long favoriteId, Long videoId);

    /**
     * 获取当前用户浏览记录,带分页
     * @param basePage 基础分页信息
     * @return
     */
    LinkedHashMap<String, List<Video>> getHistory(BasePage basePage);

    /**
     * 添加视频浏览记录
     * @param videoId 视频id
     * @param userId 用户id
     */
    void addHistory(Long videoId,Long userId);

    /**
     * 获取热度排行榜
     * @return
     */
    Collection<HotVideo> getHotRank();

    /**
     * 推送热门视频
     * @return
     */
    Collection<Video> getHotVideos();

    /**
     * 根据视频标签推送相似视频
     * @param video 视频
     * @return
     */
    Collection<Video> pushSimilarVideos(Video video);

    /**
     * 分页模糊查询视频
     * @param basePage 分页信息
     * @param YV 视频号
     * @param title 视频标题
     * @return
     */
    IPage<Video> getVideoListByPage(BasePage basePage, String YV, String title);

    /**
     * 审核放行处理
     * @param video 视频
     */
    void auditProcess(Video video);

    /**
     * 下架违规视频
     * @param id 视频id
     * @return
     */
    Boolean videoViolate(Long id);

    /**
     * 获取N天前的视频
     * @param id id
     * @param days 天数
     * @param limit 限制
     * @return
     */
    List<Video> selectNDaysAgeVideo(long id, int days, int limit);

    /**
     * 根据分类id获取标签
     * @param types 分类id
     * @return
     */
    Collection<String> getClassifyLabelsById(String types);
}
